home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 30 / Amiga Format AFCD30 (Sep 1998, Issue 114).iso / -seriously_amiga- / workbench / toolmanager / source / global_boopsi.a < prev    next >
Text File  |  1998-06-18  |  3KB  |  83 lines

  1. ;
  2. ; global_boopsi.a  V3.1
  3. ;
  4. ; BOOPSI Support Functions in M68K Assembler
  5. ;
  6. ; Copyright (C) 1990-98 Stefan Becker
  7. ;
  8. ; This source code is for educational purposes only. You may study it
  9. ; and copy ideas or algorithms from it for your own projects. It is
  10. ; not allowed to use any of the source codes (in full or in parts)
  11. ; in other programs. Especially it is not allowed to create variants
  12. ; of ToolManager or ToolManager-like programs from this source code.
  13. ;
  14.          XDEF _CoerceMethod
  15. ;         XDEF @CoerceMethodA
  16.          XDEF _DoMethod
  17.          XDEF @DoMethodA
  18.          XDEF _DoSuperMethod
  19.          XDEF @DoSuperMethodA
  20.  
  21.          SECTION  boopsi,code
  22.  
  23. ; ULONG CoerceMethod( struct IClass *, Object *, ULONG, ... );
  24. _CoerceMethod:
  25.          movem.l  A2/A3,-(SP)    ; Save A2/A3
  26.          movem.l  12(SP),A0/A2   ; A0 = IClass, A2 = Object
  27.          lea.l    20(SP),A1      ; A1 = Msg
  28.          move.l   8(A0),A3       ; Class' method dispatcher
  29.                                  ; IClass->cl_Dispatcher.h_Entry
  30.          jsr      (A3)           ; Call dispatcher
  31.          movem.l   (SP)+,A2/A3   ; Restore A2/A3
  32.          rts
  33.  
  34. ; ULONG CoerceMethodA( __A0 struct IClass *, __A2 Object *, __A1 Msg);
  35. ;@CoerceMethodA:
  36. ;         move.l   8(A0),-(SP)    ; Class' method dispatcher
  37. ;                                 ; IClass->cl_Dispatcher.h_Entry
  38. ;         rts                     ; Call dispatcher
  39.  
  40. ; ULONG DoMethod( Object *, ULONG, ... );
  41. _DoMethod:
  42.          movem.l  A2/A3,-(SP)    ; Save A2/A3
  43.          move.l   12(SP),A2      ; A2 = Object
  44.          lea.l    16(SP),A1      ; A1 = Msg
  45.          move.l   -4(A2),A0      ; A0 = IClass
  46.                                  ; ((struct _Object *) o - 1)->o_Class
  47.          move.l   8(A0),A3       ; Class' method dispatcher
  48.                                  ; IClass->cl_Dispatcher.h_Entry
  49.          jsr      (A3)           ; Call dispatcher
  50.          movem.l  (SP)+,A2/A3    ; Restore A2/A3
  51.          rts
  52.  
  53. ; ULONG DoMethodA(__A2 Object *, __A1 Msg );
  54. @DoMethodA:
  55.          move.l   -4(A2),A0      ; A0 = IClass
  56.                                  ; ((struct _Object *) o - 1)->o_Class
  57.          move.l   8(A0),-(SP)    ; Class' method dispatcher
  58.                                  ; IClass->cl_Dispatcher.h_Entry
  59.          rts                     ; Call dispatcher
  60.  
  61. ; ULONG DoSuperMethod( struct IClass *, Object *, ULONG, ... );
  62. _DoSuperMethod:
  63.          movem.l  A2/A3,-(SP)    ; Save A2/A3
  64.          movem.l  12(SP),A0/A2   ; A0 = IClass, A2 = Object
  65.          lea.l    20(SP),A1      ; A1 = Msg
  66.          move.l   24(A0),A0      ; A0 = Super class
  67.                                  ; IClass->cl_Super
  68.          move.l   8(A0),A3       ; Class' method dispatcher
  69.                                  ; IClass->cl_Dispatcher.h_Entry
  70.          jsr      (A3)           ; Call dispatcher
  71.          movem.l  (SP)+,A2/A3    ; Restore A2/A3
  72.          rts
  73.  
  74. ; ULONG DoSuperMethodA( __A0 struct IClass *, __A2 Object *, __A1 Msg );
  75. @DoSuperMethodA:
  76.          move.l   24(A0),A0      ; A0 = Super class
  77.                                  ; IClass->cl_Super
  78.          move.l   8(A0),-(SP)    ; Class' method dispatcher
  79.                                  ; IClass->cl_Dispatcher.h_Entry
  80.          rts                     ; Call dispatcher
  81.  
  82.          END
  83.